import win32com.client
import pythoncom


def create_inventor_part():
    try:
        # 启动Inventor应用（根据版本调整ProgID，例如"Inventor.Application.22"）
        inv_app = win32com.client.Dispatch("Inventor.Application")
        inv_app.Visible = True  # 让Inventor界面可见

        # 检查Inventor是否成功启动
        if inv_app is not None and hasattr(inv_app, 'Name'):
            print(f"Inventor {inv_app.Name} 启动成功！")
        else:
            raise Exception("无法启动Inventor")

        # 创建新的零件文档
        inv_doc = inv_app.Documents.Add(win32com.client.constants.kPartDocumentObject,
                                        None,  # 使用默认模板
                                        True)  # 创建可见文档

        # 获取零件组件定义
        part_def = inv_doc.ComponentDefinition

        # 在X-Y平面创建草图
        sketch = part_def.Sketches.Add(part_def.WorkPlanes.Item(3))  # 索引3通常是X-Y平面

        # 创建矩形（参数：起点X, Y, 终点X, Y）
        lines = sketch.SketchLines.AddByRectangle(-5, -5, 5, 5)

        # 添加尺寸约束（可选）
        # 这里以矩形宽度为例，设置宽度为10 cm
        if sketch.DimensionConstraints.Count == 0:
            # 假设lines.Item(1)是底边，但最好通过其他方式确认
            sketch.DimensionConstraints.AddLineLength(lines.Item(1), 10)  # 假设lines.Item(1)是底边

        # 退出草图编辑模式
        sketch.ExitEdit()

        # 创建拉伸特征（参数：草图轮廓，距离，操作类型）
        profile = sketch.Profiles.AddForSolid()
        extrude_def = part_def.Features.ExtrudeFeatures.CreateExtrudeDefinition(profile,
                                                                                win32com.client.constants.kJoinOperation)
        extrude_def.SetDistanceExtent(10, win32com.client.constants.kPositiveExtentDirection)
        extrude_feature = part_def.Features.ExtrudeFeatures.Add(extrude_def)

        # 保存文件
        save_path = r"C:\Temp\Inventor_Part.ipt"
        inv_doc.SaveAs(save_path, False)  # False表示不覆盖现有文件
        print(f"零件已保存至：{save_path}")

        # 可选：关闭Inventor应用
        # inv_app.Quit()

    except Exception as e:
        print(f"发生错误：{str(e)}")
    finally:
        # 清理COM资源
        pythoncom.CoUninitialize()


if __name__ == "__main__":
    create_inventor_part()
